# 抖码算法，让算法学习变得简单有趣
# 作者：老汤

"""
    题目 1：服务器广播

    服务器连接方式包括直接相连和间接相连。
    A 和 B 直接相连，B 和 C 直接相连，则 A 和 C 间接相连。直接连接和间接连接都可以发送广播

    给出一个 N*N 数组，代表 N 个服务器，matrix[i][j] = 1 ，则代表 i 和 j 直接相连；不等于 1 时，代表 i 和 j 不直接连接。
    matrix[i][i] = 1 表示自己和自己直接连接。matrix[i][j] = matrix[j][i]

    计算初始需要给几台服务器广播，才可以使每个服务器都收到广播

    输入描述：
    输入为 N 行，每行有 N 个数字，为 0 或 1，由空格隔开，构成 N*N 的数组，N 的范围为 1<=N<=40

    输出描述：
    输出一个数字，为需要广播的服务器的数量

    示例 1：
    输入
    1 0 0
    0 1 0
    0 0 1

    输出
    3

    说明：3 台服务器互不连接，所以需要分别广播这 3 台服务器

    示例 2：
    1 1
    1 1

    输出
    1

    说明：2 台服务器相互连接，所以只需要广播其中一台服务器
"""

# 1. 构建邻接矩阵
# 解析第一行，拿到 n
first_line = str(input()).split(" ")
n = len(first_line)

graph = [None] * n
for i in range(n):
    graph[i] = set()

# 根据第一行初始化顶点 0 的邻居顶点
for i in range(n):
    if i > 0 and first_line[i] == "1":
        graph[0].add(i)
        graph[i].add(0)

# 初始化其他顶点的邻居顶点
for i in range(1, n):
    nums = str(input()).split(" ")
    for j in range(n):
        if i != j and nums[j] == "1":
            graph[i].add(j)
            graph[j].add(i)

# 2. 计算连通分量
visited, cc_count = [False] * n, 0


def dfs(v):
    visited[v] = True
    for w in graph[v]:
        if not visited[w]:
            dfs(w)


# 遍历图中每个顶点
for v in range(n):
    # 先判断，没有遍历的顶点才能进行深度优先遍历
    if not visited[v]:
        cc_count += 1
        dfs(v)

print(cc_count)